package servidor2;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;

public class Servidor {

    correo nuevo;
    ArrayList<Cliente> clientes = new ArrayList();
    ServerSocket yoservidor = null;
    Socket cliente = null;
    DataInputStream entrada;
    BufferedReader entradaBR;
    DataOutputStream salida;
    String llego;
    int correosRecibidos = 0;
    int PUERTO = 5500;
    int nPuertoAsignado = PUERTO;
    int contSesion;
    private String usuario;
    private String pass;
    Cliente cteSesion;

    Servidor() {
        Cliente c = new Cliente("bety", "bety", 1234);
        clientes.add(c);
       // c = new Cliente("gerardo","gerardo",)
        
    }

    public static void main(String[] args) throws ClassNotFoundException {
        Servidor serv = new Servidor();
        serv.conecta();

    }

    @SuppressWarnings("empty-statement")
    public void conecta() throws ClassNotFoundException {

        while (true) {
            try {

                yoservidor = new ServerSocket(5500);
                System.out.println("Socket escuchando en puerto 5500");

                cliente = yoservidor.accept();
                System.out.println("\nSe conecto el cliente desde la IP: " + cliente.getInetAddress());

                entradaBR = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
                entrada = new DataInputStream(cliente.getInputStream());
                salida = new DataOutputStream(cliente.getOutputStream());

                usuario = entradaBR.readLine();
                pass = entradaBR.readLine();
                boolean in = false;
                for (int i = 0; i < clientes.size(); i++) {
                    if (usuario.equals(clientes.get(i).nomCliente)) {
                        in = pass.equals(clientes.get(i).password);
                        cteSesion = clientes.get(i);
                    }
                }//for

                if (in) {
                    //salida.writeBoolean(true);
                    salida.writeBoolean(true);
                    System.out.println("recibi a usuario");
                    //   enviarCEliminados(salida);

                    do {
                        System.out.println("ESPERANDO.........");
                        llego = entradaBR.readLine();//esperar a una instruccion.

                        System.out.println(llego);

                        if (llego.length() > 0) {
                            int peticion = Integer.parseInt(llego);
                            switch (peticion) {
                                case 1://nuevo correo....
                                    correo nvo = new correo(entradaBR.readLine(), entradaBR.readLine(), entradaBR.readLine(), entradaBR.readLine(), true);
                                    cteSesion.cEnviados.add(nvo);
                                    System.out.println("Nuevo correo................");
                                    break;
                                case 2://eliminar
                                    if(Integer.parseInt(entradaBR.readLine()) == 1){
                                        //si encontramos 1 eliminamos en enviados
                                        int idx = Integer.parseInt(entradaBR.readLine());
                                        cteSesion.cEliminados.add(cteSesion.cEnviados.get(idx));
                                        cteSesion.cEnviados.remove(idx);
                                    }
                                    else{
                                        int idx = Integer.parseInt(entradaBR.readLine());
                                        cteSesion.cEliminados.add(cteSesion.cRecibidos.get(idx));
                                        cteSesion.cRecibidos.remove(idx);
                                    }
                                    System.out.println("eliminar................");
                                    
                                    break;
                                case 3://actualiza enviados

                                    enviarCEnviados(salida);
                                    System.out.println("actualiza enviados................");

                                    break;
                                case 4://actualiza recibidos

                                    enviarCRecibidos(salida);
                                        System.out.println("actualiza recibidos..............");
                                    break;
                                    
                                case 5://restablece correo;
                                    
                                    if(Integer.parseInt(entradaBR.readLine()) == 1){
                                        //si encontramos 1 eliminamos en enviados
                                        int idx = Integer.parseInt(entradaBR.readLine());
                                       // cteSesion.cEliminados.add(cteSesion.cEnviados.get(idx));
                                      //  cteSesion.cEnviados.remove(idx);
                                        cteSesion.cEnviados.add(cteSesion.cEliminados.get(idx));
                                        cteSesion.cEliminados.remove(idx);
                                        
                                    }
                                    else{
                                        int idx = Integer.parseInt(entradaBR.readLine());
                                        cteSesion.cRecibidos.add(cteSesion.cEliminados.get(idx));
                                        cteSesion.cEliminados.remove(idx);
                                    }
                                    
                                    break;
                                case 6://actualiza tabla eliminados
                                    
                                    enviarCEliminados(salida);
                                    break;

                                default:
                                    break;
                            }

                            System.out.println("recibidos:" + correosRecibidos + " en sesion: " + contSesion);

                        }//llego mayor que cero

                    } while (llego.length() != 0);
                } else {
                    salida.writeBoolean(false);
                }

                desconecta();
                System.out.println("Ya termine de recibir");

            } catch (IOException e) {
                System.err.println(e.getMessage());
                System.exit(1);
            }

        }//while

    }

    public void desconecta() throws IOException {
        entrada.close();
        cliente.close();
        yoservidor.close();
    }

    private void enviarCEnviados(DataOutputStream salida) throws IOException {

        ArrayList<correo> enviados = cteSesion.cEnviados;

        System.out.println("en el medoto enviar enviados");
        for (int i = 0; i < enviados.size(); i++) {
            salida.writeUTF(" ");
            salida.writeUTF(enviados.get(i).asunto);
            salida.writeUTF(enviados.get(i).contenido);
            salida.writeUTF(enviados.get(i).fecha);
            salida.writeUTF(enviados.get(i).d_r);
            System.out.println("escribiendo correo " + i + 1);
        }

        salida.writeUTF("");

    }
    
     private void enviarCEliminados(DataOutputStream salida) throws IOException {

        ArrayList<correo> eliminados = cteSesion.cEliminados;

        System.out.println("en el medoto enviar enviados");
        for (int i = 0; i < eliminados.size(); i++) {
            salida.writeUTF(" ");
            salida.writeUTF(eliminados.get(i).asunto);
            salida.writeUTF(eliminados.get(i).contenido);
            salida.writeUTF(eliminados.get(i).fecha);
            salida.writeUTF(eliminados.get(i).d_r);
            salida.writeBoolean(eliminados.get(i).enviado);
            System.out.println("escribiendo correo " + i + 1);
        }

        salida.writeUTF("");

    }
    private void enviarCRecibidos(DataOutputStream salida) throws IOException {
        ArrayList<correo> recibidos = cteSesion.cRecibidos;

        System.out.println("en el medoto enviar enviados");
        for (int i = 0; i < recibidos.size(); i++) {
            salida.writeUTF(" ");
            salida.writeUTF(recibidos.get(i).asunto);
            salida.writeUTF(recibidos.get(i).contenido);
            salida.writeUTF(recibidos.get(i).fecha);
            salida.writeUTF(recibidos.get(i).d_r);
            System.out.println("escribiendo correo " + i + 1);
        }

        salida.writeUTF("");

    }

   

}
